STAAD.Pro Help

OS. OpenSTAADでのC#の使用に関する注意点

OpenSTAADオブジェクトを次のように取得するとします。

OpenSTAADUI.OpenSTAAD os = Marshal.GetActiveObject("StaadPro.OpenSTAAD") as OpenSTAADUI.OpenSTAAD;

'Staadpro.Openstaad'を使用することで、最初に起動されたSTAAD.Proの実行中インスタンスにアクセスすることができます。

開いているSTAAD.Proのインスタンスが複数ある場合にインスタンスにアクセスするには、次のコードを使用します。

public static OpenSTAADUI.OpenSTAAD GetStaadUiInterface (string staadFilename)
            {
             string lookUpCandidateName = RotMethods.GetStaadProCandidateNameToLookUpInRot();
            if ( string.IsNullOrEmpty(lookUpCandidateName) )
                {
                return null;
                }
            if ( string.IsNullOrEmpty(staadFilename) )
                {
                return null;
                }
            string staadFileFullPath = Path.GetFullPath(staadFilename).ToUpper();

            List<RotMethods.RotObjectInfo> runningObjects = RotMethods.GetRunningObjectList();
            foreach ( RotMethods.RotObjectInfo item in runningObjects )
                {
                string candidateName = item.Name.ToUpper();

                try
                    {
          // if this call succeeds, then it is a valid path, else it will continue
                    string extStr = Path.GetExtension(candidateName).ToUpper();
                        {
                        OpenSTAADUI.OpenSTAAD osObject = null;
                        if ( !string.IsNullOrEmpty(extStr) )
                            {
                            // check if it’s a valid STAAD file
                            if ( extStr == ".STD" )
                                {
                                osObject = item.Value as OpenSTAADUI.OpenSTAAD;
                                if ( osObject != null )
                                    {
                                    // get staad filename
                                    string openedStaadFile = GetOpenedStaadFilename(osObject).ToUpper();
                                    if ( string.Compare(staadFileFullPath, openedStaadFile, StringComparison.OrdinalIgnoreCase) == 0 )
                                        {
                                        return osObject;
                                        }
                                    }
                                }
                            }

                        if ( candidateName.StartsWith(lookUpCandidateName) )
                            {
                            // we got the staad instance
                            osObject = item.Value as OpenSTAADUI.OpenSTAAD;

                            if ( osObject != null )
                                {
                                // get staad filename
                                string lookupStaadFilename = GetOpenedStaadFilename(osObject);
                                //
                                if ( string.Compare(staadFileFullPath, lookupStaadFilename, StringComparison.OrdinalIgnoreCase) == 0 )
                                    {
                                    return osObject;
                                    }
                                }
                            }
                        }
                    }
                catch ( Exception ex )
                    {
                    throw;
                    }
                }

            return null;
            }

        private static string GetOpenedStaadFilename (OpenSTAADUI.OpenSTAAD osObject)
            {
            // get staad filename
            string staadFilename = "";
            bool includeFullPath = true;
            object oArg1 = staadFilename as object;
            object oArg2 = includeFullPath as object;
            osObject.GetSTAADFile(ref oArg1, oArg2);
            staadFilename = oArg1 as string;
            if ( staadFilename != null )
                return Path.GetFullPath(staadFilename);
            //
            return null;
            }
        }

GetStaadUiInterfaceInternal (string staadFilename)メソッドを次のように呼び出します。

OpenSTAADUI.OpenSTAAD os = GetStaadUiInterface (@"C:\Test.std");

次のヘルパーメソッドを追加する必要があります。

  [DllImport("ole32.dll")]
            private static extern int GetRunningObjectTable (int reserved, out IRunningObjectTable prot);
            
            [DllImport("ole32.dll")]
            private static extern int CreateBindCtx (int reserved, out IBindCtx ppbc);
            
            public class RotObjectInfo
            {
            public string Name
            {
            get;
            set;
            }
            
            public object Value
            {
            get;
            set;
            }
            }
            public static List<RotObjectInfo> GetRunningObjectList ()
            {
            try
            {
            var result = new List<RotObjectInfo>();
            
            var numFetched = new IntPtr();
            IRunningObjectTable runningObjectTable;
            IEnumMoniker monikerEnumerator;
            var monikers = new IMoniker[1];
            
            GetRunningObjectTable(0, out runningObjectTable);
            
            runningObjectTable.EnumRunning(out monikerEnumerator);
            monikerEnumerator.Reset();
            
            while ( monikerEnumerator.Next(1, monikers, numFetched) == 0 )
            {
            IBindCtx ctx;
            CreateBindCtx(0, out ctx);
            
            string runningObjectName;
            monikers[0].GetDisplayName(ctx, null, out runningObjectName);
            
            object runningObjectVal;
            runningObjectTable.GetObject(monikers[0], out runningObjectVal);
            
            var objInfo = new RotObjectInfo
            {
            Name = runningObjectName,
            Value = runningObjectVal
            };
            
            result.Add(objInfo);
            }
            
            return result;
            }
            catch ( Exception )
            {
            throw;
            }
            }